Check valid range for n before calling acos(n). Set errno always to zero.
authoroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 29 Apr 2006 16:41:30 +0000 (16:41 +0000)
committeroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 29 Apr 2006 16:41:30 +0000 (16:41 +0000)
gpsbabel/grtcirc.c

index d2cd3a7fc43f8f6299261719064558e06546185b..752e3f229244eb0a875784444a8b03a919f50ea4 100644 (file)
@@ -59,10 +59,18 @@ double radtometers( double rads ) {
 
 double gcdist( double lat1, double lon1, double lat2, double lon2 ) {
   double res;
-  res = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2));
-  if (errno == EDOM) { /* Math argument out of domain of function */
-    errno = 0;
-    return 0;
+
+  errno = 0;
+
+  res = sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2);
+  if (res > 1.0) res = 1.0;
+  else if (res < -1.0) res = -1.0;
+
+  res = acos(res);
+
+  if ((isnan(res)) || (errno == EDOM)) { /* this should never happen: */
+    errno = 0;                           /* Math argument out of domain of function, */
+    return 0;                            /* or value returned is not a number */
   }
   return res;
 }